import java.util.ArrayList;

public class V{

	private ArrayList<Integer> vecteur;

	/*constructeurs*/

	public V()
	{
		this.vecteur = new ArrayList<Integer>();
	}

	public V(int n,Integer val)
	{
		this();
		for(int i= 0; i < n;i++)
			this.vecteur.add(val);
	}

	public V(Integer val)
	{
		this();
		this.vecteur.add(val);
	}

	public V(V copie)
	{
		this();
		for(int i = 0; i < copie.size();i++)
			this.vecteur.add(copie.get(i));
	}
	
	/*accesseurs*/

	public ArrayList<Integer> getVecteur() {
		return vecteur;
	}

	public void setVecteur(ArrayList<Integer> vecteur) {
		this.vecteur = vecteur;
	}

	public int size()
	{
		return this.vecteur.size();
	}
	
	public void supr(int i)
	{
		this.vecteur.remove(i);
	}

	/*fonctions*/

	int membre(Integer i)
	{
		if(this.vecteur.contains(i))
			return 1;
		return 0;
	}

	public void ajout_integer(Integer i)
	{
		this.vecteur.add(i);
	}

	public V concat(V v2)
	{
		V resultat = new V();
		for(int i = 0; i < this.vecteur.size();i++)
			resultat.ajout_integer(this.vecteur.get(i));
		for(int i = 0; i < v2.getVecteur().size();i++)
			resultat.ajout_integer(v2.getVecteur().get(i));
		return resultat;
	}

	public Integer get(int i)
	{
		return this.vecteur.get(i);
	}

	public void set(int i,Integer val)
	{
		this.vecteur.set(i,val);
	}

	public V indicer(V indice)
	{
		V v3 = new V();
		for(int i = 0; i < indice.getVecteur().size();i++)
		{
			v3.ajout_integer(this.vecteur.get(indice.getVecteur().get(i)));
		}
		return v3;
	}

	public V union()
	{
		V v2 = new V();
		for(int i = 0; i < this.vecteur.size();i++)
		{
			if(v2.size() == 0)
				v2.ajout_integer(this.vecteur.get(i));
			else
				if(v2.membre(this.vecteur.get(i)) == 0)
					v2.ajout_integer(this.vecteur.get(i));
		}
		return v2;
	}
	
	public void clear()
	{
		this.vecteur.clear();
	}
	
	/*fonction d'affichage */
	
	public String toString()
	{
		String tmp = null;
		tmp = "_______________________\n";
		tmp += "Vecteur ::\n";
		for(int i = 0; i < this.vecteur.size();i++)
		{
			tmp += this.vecteur.get(i) + " ";
		}
		tmp += "\n_______________________\n";
		return tmp;
	}
	
	public void lister(D d)
	{
		System.out.println("_______________________");
		System.out.println("Vecteur ::");
		for(int i= 0;i< this.vecteur.size();i++)
		{
			System.out.print(d.decode(this.vecteur.get(i)) + " ");	
		}
		System.out.println("\n_______________________");	
	}

	public void lister()
	{
		this.lister(D.getInstance());
		/*
		System.out.println("_______________________");
		System.out.println("Vecteur ::");
		for(int i= 0;i< this.vecteur.size();i++)
		{
			System.out.print(D.getInstance().decode(this.vecteur.get(i))+" ");
		}
		System.out.println("\n_______________________");*/
	}

	/* Test Unitaire */
	
	public static void main(String Args[]){

		V v1 = new V();
		System.out.println(v1.toString());

		V v2 = new V(10,0);
		System.out.println(v2.toString());

		ArrayList<Integer> al = v2.getVecteur();
		System.out.println(al.toString());

		v1.setVecteur(al);
		System.out.println(v1.toString());
		System.out.println(v2.toString());
		for(int i = 0; i < v1.size();i++)
			v1.set(i,i);
		System.out.println(v1.toString());
		System.out.println(v2.toString());

		System.out.println(v1.membre(5));

		v2.ajout_integer(2);
		System.out.println(v2.toString());

		System.out.println(v2.get(2));

		V v3 = v1.concat(v2);
		System.out.println(v3.toString());

		for(int i = 0; i < v1.size();i++)
			v2.set(i,10);

		v1 = v3.indicer(v2);
		System.out.println(v1.toString());
		
		v1 = v1.union();
		System.out.println(v1.toString());

		V v4 = new V();
		v4.ajout_integer(0);
		D.getInstance().code("zero");
		v4.ajout_integer(1);
		D.getInstance().code("un");
		v4.ajout_integer(2);
		D.getInstance().code("deux");
		
		v4.lister(D.getInstance());
		v4.lister();
		
	}
}
